// 发送Ajax请求
import webApiUtil from '../utils/apl-common-web-api-util'
import dialog from '@vant/weapp/dialog/dialog';

class BreakSignal {}

var openId = ''

const callApi = (url, data, method = 'GET', autoLogin = false, autoRegist = true, isSendToken = true, onSuccess = null, onFailed = null, loadingTitle = null) => {
  
  wx.showLoading({
    title: loadingTitle ? loadingTitle : "正在加载",
    mask: true
  })
  var webRequestPromise = webApiUtil(url, data, method, isSendToken);
  webRequestPromise
    .then(function (res) {
      saveTokenIdAsSessionId(res)
      // wx.hideLoading();
      /** start 根据需求接口的返回状态码进行处理 */
      switch (true) {
        case isHttp2XXX(res.statusCode):
          console.log("API调用完毕后处理：isHttp2XXX")
          if (!res.data || !res.data.hasOwnProperty("code") || res.data.code == null) {
            return createRejectObj('远程API返回的响应体中没有有效的code')
          }
          let apiResultcode = res.data.code;
          if (isApiNoException(apiResultcode)) {
           
            if (isApiSuccess(apiResultcode)) {
              console.log("API调用成功，即将调用Callee的OnSuccsess")
              onSuccess(res.data);
            }
            //数据验证错误（服务器端应该在数据验证错的的时候，返回的code范围是100~199）
            if (hashValidateError(apiResultcode)) {
              if (res.data.msgShowType && res.data.msgShowType == "PopOneButtonConfirm") {
                if (res.data.result) {
                  let messageDialog = ''
                  for (var item in res.data.result) {
                    for (var i = 0; i < res.data.result[item].length; i++) {
                      // messageDialog=messageDialog+res.data.result[item][i]+ "\n"
                      //现在后台check显示策略是：每次只显示一个错误信息
                      messageDialog = messageDialog + res.data.result[item][i]
                      break;
                    }
                    break;
                  }
                  dialog.alert({
                    message: messageDialog,
                  }).then(() => {
                    // on close
                  });

                } else {
                  //业务check出错弹出popup
                  dialog.alert({
                    message: res.data.message,
                  }).then(() => {
                    // on close
                  });
                }

              } else if (res.data.msgShowType && res.data.msgShowType == "PopBackOneButtonConfirm") {

                if (res.data.result) {
                  let messageDialog = ''
                  for (var item in res.data.result) {
                    for (var i = 0; i < res.data.result[item].length; i++) {
                      // messageDialog=messageDialog+res.data.result[item][i]+ "\n"
                      //现在后台check显示策略是：每次只显示一个错误信息
                      messageDialog = messageDialog + res.data.result[item][i]
                      break;
                    }
                    break;
                  }
                  dialog.alert({
                    message: messageDialog,
                  }).then(() => {
                    wx.navigateBack({
                      delta: 1
                    })
                  });
                } else {
                  dialog.alert({
                    message: res.data.message,
                  }).then(() => {
                    wx.navigateBack({
                      delta: 1
                    })
                  });
                }
              } else {
                if (onFailed) {
                  onFailed(res.data);
                }
              }
            }
            return createRejectObj('finished'); //处理成功，终止后续处理
          } else {

            if(apiResultcode == '500') {
              // controller端return error，画面页自己处理去
            
              if (onSuccess) {
                onSuccess(res.data);
              }
              return createRejectObj('api500')
            }
            
            if (onFailed) {
              onFailed(res)
            }
            //服务端发生了系统异常(包含token非法)
            return dispachError(apiResultcode, autoLogin, autoRegist);
          }
          break;
        case isHttp4XXX(res.statusCode):
          
          console.log("API调用完毕后处理：isHttp4XXX")
          // 正常处理（返回的HttpCode在400区间）
          if (res.data && res.data.hasOwnProperty("code") && res.data.code !== null) {
            if(res.statusCode == 401 && autoLogin){
              return createResloveObj('re-login')
            }else{
              return dispachError(res.data.code, autoLogin, autoRegist);
            }
          } else {
            return createRejectObj('API服务不可用')
          }
          break;
        default:
          
          console.log("API调用完毕后处理：default")
          return createRejectObj('未知错误')
      }
      /** end 处理结束*/
    })
    .then(
      // token已过期，重新执行login
      function (res) {
        return reWxLogin()
      }
    )
    .then(
      // relogin成功(传入的参数是微信返回来的用户登录凭证（有效期五分钟）)
      function (res) {
        return aplLogin(res);
      }
    )
    .then(
      function (res) {
        // login成功，重新执行用户请求
        // 判定APLLogin成果，决定是否重新执行用户请求
        return webApiUtil(url, data, method, isSendToken);
      }
    )
    .then(
      // 获取处理结果
      function (res) {
        
        saveTokenIdAsSessionId(res)
        // wx.hideLoading();
        /** start 根据需求接口的返回状态码进行处理 */
        switch (true) {
          case isHttp2XXX(res.statusCode):
            console.log("API调用完毕后处理：isHttp2XXX")
            if (!res.data || !res.data.hasOwnProperty("code") || res.data.code == null) {
              return createRejectObj('远程API返回的响应体中没有有效的code')
            }
            let apiResultcode = res.data.code;
            if (isApiNoException(apiResultcode)) {
             
              if (isApiSuccess(apiResultcode)) {
                console.log("API调用成功，即将调用Callee的OnSuccsess")
                onSuccess(res.data);
              }
              //数据验证错误（服务器端应该在数据验证错的的时候，返回的code范围是100~199）
              if (hashValidateError(apiResultcode)) {
                if (res.data.msgShowType && res.data.msgShowType == "PopOneButtonConfirm") {
                  if (res.data.result) {
                    let messageDialog = ''
                    for (var item in res.data.result) {
                      for (var i = 0; i < res.data.result[item].length; i++) {
                        // messageDialog=messageDialog+res.data.result[item][i]+ "\n"
                        //现在后台check显示策略是：每次只显示一个错误信息
                        messageDialog = messageDialog + res.data.result[item][i]
                        break;
                      }
                      break;
                    }
                    dialog.alert({
                      message: messageDialog,
                    }).then(() => {
                      // on close
                    });
  
                  } else {
                    //业务check出错弹出popup
                    dialog.alert({
                      message: res.data.message,
                    }).then(() => {
                      // on close
                    });
                  }
  
                } else if (res.data.msgShowType && res.data.msgShowType == "PopBackOneButtonConfirm") {
  
                  if (res.data.result) {
                    let messageDialog = ''
                    for (var item in res.data.result) {
                      for (var i = 0; i < res.data.result[item].length; i++) {
                        // messageDialog=messageDialog+res.data.result[item][i]+ "\n"
                        //现在后台check显示策略是：每次只显示一个错误信息
                        messageDialog = messageDialog + res.data.result[item][i]
                        break;
                      }
                      break;
                    }
                    dialog.alert({
                      message: messageDialog,
                    }).then(() => {
                      wx.navigateBack({
                        delta: 1
                      })
                    });
                  } else {
                    dialog.alert({
                      message: res.data.message,
                    }).then(() => {
                      wx.navigateBack({
                        delta: 1
                      })
                    });
                  }
                } else {
                  if (onFailed) {
                    onFailed(res.data);
                  }
                }
              }
              return createRejectObj('finished'); //处理成功，终止后续处理
            } else {
              if(apiResultcode == '500') {
                // controller端return error，画面页自己处理去
                if (onSuccess) {
                  onSuccess(res.data);
                }
                return createRejectObj('api500')
              }
              if (onFailed) {
                onFailed(res)
              }
              //服务端发生了系统异常(包含token非法)
              return dispachError(apiResultcode, autoLogin, autoRegist);
            }
            break;
          case isHttp4XXX(res.statusCode):
            console.log("API调用完毕后处理：isHttp4XXX")
            // 正常处理（返回的HttpCode在400区间）
            if (res.data && res.data.hasOwnProperty("code") && res.data.code !== null) {
              if(res.statusCode == 401 && autoLogin){
                return createResloveObj('re-login')
              }else{
                return dispachError(res.data.code, autoLogin, autoRegist);
              }
            } else {
              return createRejectObj('API服务不可用')
            }
            break;
          default:
            console.log("API调用完毕后处理：default")
            return createRejectObj('未知错误')
        }
        /** end 处理结束*/
  
      }
    )
    .catch(
      function (data) {
        if (data == 'finished') {
          // 什么也不做，API正确返回了结果
        } else if (data == 'api500') {
          // 什么也不做，API正确返回了结果

        } else if (data == 'break') {
          // 业务进行不下去了，由客户端执行决定如何处理
          if (onFailed) {
            onFailed("paused~~~~~~~~~~~~~~~~~");
          }
        } else {
          // 调用Web服务的过程中发生了系统异常
          //wx.hideLoading();
          //showError();
          if (onFailed) {
            onFailed(data);
          }
        }
      }
    )
    .finally(
      () => {
        wx.hideLoading();
      }
    )
}
//=======================================================
//重新登录
//=======================================================
const reWxLogin = function () {
  return new Promise((resolve, reject) => {

    wx.login({
      success(res) {
        if (res.code) {
          openId = res.code
          resolve(res.code)
        } else {
          // 调用微信Login失败
          reject(res.errMsg)
        }
      },
      fail(error) {
        // 调用微信LogIn处理发生了异常
        reject(error);
      }
    })


  })
}
//=======================================================
// 根据用户传递过来的Code执行用户登录
//=======================================================
const aplLogin = function (data) {

  const accountInfo = wx.getAccountInfoSync();

  //调用自己系统的Login接口，使用wxlogincode在服务器端调用微信的[auth.code2Session]
  //服务器端Step1：获取openid，unionid，session_key
  //服务器端Step2：基于OpenId和UninId判定用户是否已注册，未注册则返回，已注册则自动登录，并返回TokenId。未注册时候要返回标识，在全局存一下标识，点击操作时候先判断是否注册没注册就先注册
  var webRequestPromise = webApiUtil('/ums/wx-auto-login', {
    appId: accountInfo.miniProgram.appId,
    code: data,
    userType: '1'
  }, 'post', false)
  return webRequestPromise
    .then(function (res) {
      /** start 根据需求接口的返回状态码进行处理 */
      switch (true) {
        case 200 <= res.statusCode && res.statusCode <= 299:
          if (!res.data || !res.data.hasOwnProperty("code") || res.data.code == null) {
            return createRejectObj('远程API返回的响应体中没有有效的code')
          }
          let apiResultcode = res.data.code;
          if (apiResultcode <= 200) {
            // 0~200：正常处理（返回的HttpCode在200区间）
            // if (res.header &&
            //   res.header.Authorization &&
            //   res.header.Authorization !== "") {
            //   wx.setStorageSync('shtoken', res.header.Authorization)
            // }
            saveTokenIdAsSessionId(res)
            return createResloveObj('reload-url'); //处理成功，重新执行原来的方法

          } else {
            //服务端发生了系统异常(包含token非法)
            return dispachError(apiResultcode, false, false); //不需要重新登录
          }
          case 400 <= res.statusCode && res.statusCode <= 499:
            // 正常处理（返回的HttpCode在400区间）
            if (res.data && res.data.hasOwnProperty("code") && res.data.code !== null) {
              return dispachError(res.data.code, autoLogin, autoRegist);
            } else {
              return createRejectObj('API服务不可用')
            }
            default:
              return createRejectObj('未知错误')
      }
      /** end 处理结束*/
    })

}

//=======================================================
// 根据服务端返回的错误CODE，生成相应的错误原因
//=======================================================
const dispachError = function (apiResultcode, autoLogin, autoRegist) {
  //300:用户没有注册
  if (apiResultcode == 300) {
    if(autoRegist){
      wx.navigateTo({
        url: '/pages/regist/regist',
      })
    }else{
      //返回给页面，页面自动处理没有注册事件
      return createRejectObj('regist'); //用户需要注册
    }

  } else if (apiResultcode == 301 || apiResultcode == 302 || apiResultcode == 303 || apiResultcode == 304 || apiResultcode == 305) {
    if (autoLogin) {
      return createResloveObj('re-login');
    } else {
      //301:token格式不对 303:Toke认证内部错误 304:Token携带信息丢失 305:Token验证失败
      return createRejectObj('访问凭据失效，请重新登录(ErrCode：' + apiResultcode + ')')
    }
  } else if (apiResultcode == 306) {
    // Token代表的用户不存在
    return createRejectObj('当前用户无效，无法提供服务')
  } else if (apiResultcode == 307) {
    // 用户锁定中
    return createRejectObj('当前用户锁定中，请稍后重试')
  } else if (apiResultcode == 329) {
    // Token相关的其他错误
    return createRejectObj('API服务不可用')
  } else if (apiResultcode == 330) {
    // 权限不足
    return createRejectObj('权限不足，无法访问该服务')
  } else if (apiResultcode == 901) {
    // 用户不存在
    return createRejectObj('该用户不存在，请注册')
  } else if (apiResultcode == 902) {
    // 用户已被冻结
    return createRejectObj('用户登录失败，当前用户已被冻结')
  } else if (apiResultcode == 903) {
    // 手机验证码错误
    return createRejectObj('手机验证码错误')
  } else if (apiResultcode == 904) {
    // 手机号或密码错误
    return createRejectObj('手机号或密码错误')
  } else {
    //其他错误
    return createRejectObj('发生额了其他错误')
  }
}
//=======================================================
// 显示用户友好的错误提示框
//=======================================================
const showError = function (message) {
  message = message ? message : '',
    wx.showModal({
      title: '提示',
      content: '十分抱歉，当前服务暂时不可用。' + message,
      showCancel: false,
      success(res) {
        if (res.confirm) {
          console.log('用户点击确定')
        } else if (res.cancel) {
          console.log('用户点击取消')
        }
      }
    })
}
//=======================================================
// 生成Promise的Reject对象
//=======================================================
const createRejectObj = function (errMessage) {
  return new Promise((reslove, reject) => {
    reject(errMessage)
  });
}
//=======================================================
// 生成Promise的Reject对象
//=======================================================
const createResloveObj = function (message) {
  return new Promise((reslove, reject) => {
    reslove(message)
  });
}

const saveTokenIdAsSessionId = function (response) {
  if (response.header &&
    response.header['X-Access-Token'] &&
    response.header['X-Access-Token'] !== "") {
    wx.setStorageSync('shtoken', response.header.Authorization)
    console.log('save X-Session-Id :', response.header['X-Access-Token'])

  }
  if (response.header &&
    response.header['X-Session-Id'] &&
    response.header['X-Session-Id'] !== "") {
    wx.setStorageSync('shsession', response.header['X-Session-Id'])
    console.log('X-Session-Id', response.header['X-Session-Id'])
  }
}

// 判断服务器端返回的是HTTP状态码是否正常(返回的HttpStatusCode是200区段)
const isHttp2XXX = function (httpStatusCode) {
  console.log("httpStatusCode:",httpStatusCode)
  if (0 <= httpStatusCode && httpStatusCode <= 299) {
    return true
  } else {
    return false
  }
}
// 判断服务器端返回的是HTTP状态码是否异常(返回的HttpStatusCode是400区段)
const isHttp4XXX = function (httpStatusCode) {
  if (400 <= httpStatusCode && httpStatusCode <= 499) {
    return true
  } else {
    return false
  }
}

// 判断服务器端处理是否没有致命异常(返回的code是0~200)
const isApiNoException = function (apiResultcode) {
  if (0 <= apiResultcode && apiResultcode <= 200) {
    return true
  } else {
    return false
  }
}
// 判断服务器端处理是否没有致命异常(返回的code是200)
const isApiSuccess = function (apiResultcode) {
  if (apiResultcode == 200 || apiResultcode == 0)  {
    return true
  } else {
    return false
  }
}
// 判断服务器端处理是否包含业务错误/警告信息(返回的code是0~199)
const hashValidateError = function (apiResultcode) {
  if (0 <= apiResultcode && apiResultcode <= 199) {
    return true
  } else {
    return false
  }
}

module.exports = {
  callApi
}